home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 3
/
Gekikoh Dennoh Club Vol. 3 (Japan).7z
/
Gekikoh Dennoh Club Vol. 3 (Japan) (Track 1).bin
/
fsw3
/
ksh
/
readme.x68
< prev
Wrap
Text File
|
1994-11-15
|
17KB
|
554 lines
KornShell v4.9 for Human68k $Id: readme.x68,v 1.12 1994/04/30 11:35:31 homy Exp $
● はじめに
Public Domain KornShell v4.9 を Human68k に移植しました。
● Korn Shell とは
歴史的なことはよく知りません。いま流行(!?)の System V に由来するようで
す。
機能的には Bourne Shell + α といったところでしょうか。ヒストリ機能や
変数評価、ジョブ制御、コマンドライン編集などが強化されているようです。
GNU の Bourne Again Shell(bash)の手本にもなったようです。
● Version 4.5 との違い
本 PD ksh のバージョンは 4.9 です。以下に v 4.5 からの変更点を述べます。
1 コマンドライン編集
o 補完できるところまで補完してから、候補一覧を表示する complete-list が
追加された(デフォルトでESC = にバインドされている)。
2 シェル本体の機能
o FCEDIT, COLUMNS を特殊変数として扱うようになった。これらの変数への代入
は、即座に ksh 内部に反映されるようになった。
o リダイレクト先にワイルドカードが使えるようになった。
例:
カレントディレクトリに foo bar baz というファイルがある場合、
echo message > f*
は echo の結果が foo にリダイレクトされる。
echo message > b*
は echo の結果を b* というファイルに出力しようとするが、Human68k は * を
ファイル名に含むことができないので、失敗する。
o ビルトイン select コマンドが追加された(ksh.man 参照)。
スクリプト例:
#! /bin/ksh
cpus='68000 68EC030 68030 68040 8086 80286 i386 i486'
PS3="What is your machine's CPU type? "
select choice in $cpus; do
case $choice in
68*) echo "モトローラ($choice)入ってる。";;
*86) echo "インテル($choice)入ってる。";;
esac
done
実行例:
1) 68000
2) 68EC030
3) 68030
4) 68040
5) 8086
6) 80286
7) i386
8) i486
What is your machine's CPU type? 3
モトローラ(68030)入ってる。
What is your machine's CPU type? 8
インテル(i486)入ってる。
What is your machine's CPU type? ^Z
● Human68k 版
1 制限、バグ
o ジョブ制御機能はありません。
o 一部コマンドはダミーです。エラーにはなりませんが機能していません。
umask, ulimit, kill, times, jobs
o 一部機能は本物と挙動が異なります。
wait は待つものがありません。wait() の値を持って即座に復帰します。
trap でシグナル番号として 2 や INT 以外を指定しても無視します。
o () や `` のように本来別プロセスで実行されるべきコマンドも同一のシェ
ル上で実行します。このため () や `` 内で定義あるいは変更した alias は、
() や `` 内の実行を終了した後もそのまま残ります。ただし、変数や関数は
残らないようにしています。
o 行編集の vi モードは、需要がほとんどないだろうという勝手な推測と、日
本語対応にするのが面倒そうという実用的な理由により Human68k 版では組み
込んでいません。
o メールの着信通知機能は外してあります。組み込むのは簡単ですが、無駄だ
と思いますので。要望が多ければいつでも組み込みます。
o 組み込み exec コマンドがそれらしく動くようになっています。単純にコマ
ンド実行が終わったら exit するだけですが。。
o 変数 KSH_VERSION の形式が微妙に異なります。オリジナルでは
@(#)PD KSH v4.5 92/04/25
ですが、Human68k 版では
@(#)PD KSH v4.5(X6_1) May 3 1992
となります。バージョン番号に "(X6_?)" が追加され、日付のフィールドのフォ
ーマットも違っています。特に不都合はないと思います。移植性を考慮したシェ
ルスクリプトを書きたい場合は、以下のようにします。
case "$KSH_VERSION" in
*X6*) # Human68k 版のとき
:
:
;;
*) # Human68k 版ではないとき
:
:
;;
esac
2 独自機能
o ksh が実行可能とみなすファイルは
1) ファイル属性の第 7 bit が立ったもの
2) 拡張子が .r のもの
3) 拡張子が .z のもの
4) 拡張子が .x のもの
5) 拡張子が .sh のもの
6) 拡張子が .bat のもの
です。検索は上記の 1) ~ 6) の順に行われます。ただし、2) ~ 6) の条件
を満たしておらず、1) のみを満たしているファイルで、正しく実行できるの
は .x 形式のファイルとスクリプトファイルです。1) のみを満たす .x 形式
のファイルを実行させるには execd (沖@沖氏作) が必要です。
o コマンドライン編集でキーにアサインできる機能として以下のものが追加さ
れています。
delete-char-forward-or-list-file-or-eot
delete-char-forward-or-list-file
clear-and-redraw
previous-match
next-match
nop
complete-variable
list-variable
このうち clear-and-redraw は ^L にアサインされています。
delete-char-* は fish のパクリです。
previous-match、next-match は Human68k 版 GNU readline、fish、tcshなど
でおなじみのコマンドラインに入力されている文字列とマッチするヒストリを
検索する機能です。
nop は no-op の別名です。
complete-variable、list-variable は変数名を補完する機能です。デフォルト
で ESC-ESC にバインドされている complete や ESC-? にバインドされている
list も拡張されていて、`$' で始まる単語は変数とみなして補完します。
o オプション autocolumns をセットする(set -o autocolumns)ことで、コマン
ドを実行する都度、変数 COLUMNS が画面の幅にセットされます。画面幅の獲得
には IOCS コールの B_CONSOL を用いています。export COLUMNS することで、
ITA TOOLBOX の ls などに正しい画面幅を伝えることができます。
o 行編集機能における画面の幅の判断はオプション usecolumns によって制御
できます。usecolumns がセットされている(set -o usecolumns)ときは、変数
COLUMNS の値を画面の幅とみなして動作します。usecolumns がセットされてい
ない場合は、ksh が画面の幅を自動的(B_CONSOL を用いて)に判断します。
SX-WINDOW や Ko-Window 上で ksh を用いる場合は、usecolumns をセットして
おき、COLUMNS にウィンドウの幅を設定して使うと良いでしょう。
o 行編集において、行頭で delete-char-backward(^H) や backward-char(^B)
を実行したり、行末で、forward-char(^F) を実行してもベルを鳴らさないよ
うにしました。オリジナルの PD ksh と同様に戻したい場合はオプション
noisyedit をセット(set -o noisyedit)してください。
o オプション meta を設定する(set -o meta)と、X68000 本体の OPT.1 キー
をメタキーとして認識するようになります。例えば、OPT.1+f で M-f にバイ
ンドされた行編集コマンドが実行されます。
o オプション ctlspc を設定する(set -o ctlspc)と、CTRL+` '(スペース)ま
たは CTRL+`@' を認識するようになります。
o オプション rmstar をセットする(set -o rmstar)と、`rm *' が実行される
前に確認を求めてくるようになります。
o デフォルトの値として参照する /etc/profile、/bin/sh、/bin/command、
/tmp は変数 SYSROOT の値を参照してアクセスします。SYSROOT が設定してあ
れば、上記についてはそれぞれ $SYSROOT/etc/profile、$SYSROOT/bin/sh、
$SYSROOT/bin/sh、 $SYSROOT/bin/command、$SYSROOT/tmp がアクセスされま
す。ただし、上記のデフォルト値は /etc/profile を除いて、それぞれ以下の
ような変数の値が優先します。
デフォルト値 変数名
---------------------------------------
/bin/sh EXECSHELL, SHELL
/bin/command COMSPEC
/tmp temp
o オプション refersysroot を設定する(set -o refersysroot)と、cd とコマ
ンド検索時に、`/' で始まるパスは $SYSROOT/ で始まるものとみなすように
した(cd /bin は cd $SYSROOT/bin とみなす。PATH=/bin なら PATH=a:/bin
とみなす)。また、ksh が起動する外部コマンドへの環境変数 path は
$SYSROOT を先頭に追加した要素から構成されるようになる(PATH=/bin と設定
してある場合、path=$SYSROOT/bin となる)
o 起動時に -0 または -l オプションを指定するとログインシェルと同様に動作
します。すなわち、起動時に $SYSROOT/etc/profile, ~/.profile を実行します。また
set -l が暗黙に実行されます。
o 漢字にある程度対応しました。問題ない程度には使えると思います。
o set -o nodups とすることで、直前に実行したものと同じコマンドはヒスト
リに格納しなくなります。
o スクリプトファイルの先頭が #! で始まるときは #! の直後に書いていある
ものをインタプリタ名として解釈し、実行します。このとき PATH による検索
を行います。これによって、
#! sed -f
s/foo/bar/g
のような内容のファイル foo.sh を作っておいて PATH 上に置いて
foo datafile
とすると、sed -f foo.sh datafile のようにコマンドが起動されます。なお、
インタプリタに渡せる引数(上の例では -f)は1つだけです。
なお、Human68k の DOS _EXEC が execd などによってスクリプトを実行でき
るように拡張されている場合は、まず DOS _EXEC により実行を試み、それが
失敗したときに限り上記の動作を行います。
o 変数 PERIOD_VAR に 0 以外の整数をセットすると、変数名にピリオド(.)が
使えるようになります。
o コマンドラインが長くなってもできるだけ正しく引数をコマンドに渡そうと
します。実行するコマンドが HUPAIR 適合なら、引数は正しく渡されます。実
行するコマンドが HUPAIR 適合でない場合は、変数 HUGEARG を見てその設定
に従います。
1) HUGEARG=indirect または未設定
引数を格納した中間ファイルを作り、引数として
-+-+-中間ファイル名
を渡します。
2) HUGEARG="indirect <文字列>"
引数を格納した中間ファイルを作り、引数として
<文字列>中間ファイル名
を渡します。
3) HUGEARG=force
引数をそのまま渡して実行します。
4) それ以外
実行をあきらめます。
o 組み込みステートメント `noencode' を追加しました。
noencode command [args...]
command を実行します。起動される command には引数リスト args
を単一の空白 ` ' によって連結した文字列を HUPAIR エンコードせ
ずに渡します。command が builtin コマンドの場合は意味がありま
せん。
例えば、通常
foo -s\"pi\" C_1.GF
のようにコマンドを実行すると、foo には HUPAIR エンコードされた引数文字
列「'-s"pi"' C_1.GF」が渡されます。noencode ステートメントを使って次の
ようにすると、
noencode foo -s\"pi\" C_1.GF
foo には文字列「-s"pi" C_1.GF」が渡されます。引数中の ' や " に特殊な解
釈を行うコマンドの実行に便利です。そのようなコマンドは
alias foo='noencode foo'
のように alias 定義しておくとなお便利でしょう。
o 組み込みステートメント `noglob を追加しました。
noglob command [args...]
command を実行します。起動されるコマンドの引数リストにおいてファ
イル名展開は行いません。一時的に set -o noglob したのとほぼ同様
の効果が得られます。
noglob は ksh にファイル名展開を行わせず、実行するコマンドにファイル名
展開を任せたいときなどに使用します。例えば、
alias ren='noglob command ren'
のようなエイリアス定義をしておくと、command と同様の感覚で ren コマン
ドが使えます。
o オリジナルでは pwd は alias で print -r "$PWD" と定義されていますが、
Human68k 版では本物の builtin コマンドです。$PWD の値と pwd で表示される
値は以下の例のように異なることがあります。
$ pwd
a:/
$ ls -lF
d---rwx 0 Jun 7 1992 19:07 bin/
la--rwx 3 Jun 7 1992 20:39 foo -> bin/bar
$ cd foo # シンボリックリンクに cd
$ pwd
a:/bin/bar # 本当のディレクトリ名を表示
$ echo -r "$PWD"
a:/foo # 見かけ上のディレクトリ名を表示
$ cd ..
$ pwd
a:/ # cd コマンドは見かけ上のディレクトリを移動する
$
o csh ライクな {..,..} の展開ができます。set -o expandbrace すると、以下
の用に展開されます。
$ echo Makefile.{1,2}
Makefile.{1,2}
$ set -o expandbrace
$ echo Makefile.{1,2}
Makefile.1 Makefile.2
$ echo test.c{,.bak}
test.c test.c.bak
$ ls
alloc.c alloc.o Makefile
$ echo a{l,b}*
alloc.c alloc.o ab*
{..,..} 展開は存在するファイルに関係なく行います。また、*?[] のワイルド
カード展開に先だっておこないます。
オリジナルの PD ksh では v4.6 から {..} の展開を行うようになっているの
ですが、{..} 展開の後にワイルドカード展開等を行わず不便なので、v4.6 で
追加されたコードは使用していません。
o 組み込みコマンドの print に -R オプションが追加されています。意味は
以下の通りです。
-R `\' によるエスケープシーケンスを解釈しない。また、以降
に -n 以外のオプションがあってもそれを通常の引数と同様
に扱う。
また、組み込みエイリアスが echo=print から echo='print -R'に変更されて
います。このため、echo によって `\t' のような `\' を使ったエスケープシー
ケンスが解釈されることはありません。
o クォートされていない `=' で始まる単語に対して特殊な置換を行います。
`=' より後の単語を外部コマンド名であるとみなして検索し、見つかった場合
はそのフルパスに置換されます。見つからなかった場合はその単語のまま残り
ます。
オプション `noequals' をセットすることにより、この置換を行わせなくす
ることができます。
例:
PATH 上に a:/usr/local/bin/less.x というコマンドのみがあるとすると、
$ echo =less
a:/usr/local/bin/less.x
$ echo =foo
=foo
$ echo '=less'
=less
$ set -o noequals
$ echo =less
=less
3 その他
o 本プログラムには SHARP XC Version 1 のライブラリがリンクしてあります。
o 起動時に環境変数エリアがないとアドレスエラーになります(XC v1 のスター
トアップルーチンがこのような状況を考慮していないためです)。CONFIG.SYS
の SHELL= や PROGRAM= で ksh を指定するときは、CONFIG.SYS で
ENVSET=256 のように指定して環境変数エリアを確保してください。
o コマンド検索はあまり速くありません。起動時に -h オプションを付けるか
起動後に set -h することで、一度実行したコマンドは覚えておくようになり
ます。すこしは快適に使えるはずです。
o バッチファイルの実行をサポートしています。.bat の拡張子を持つファイ
ルは変数 COMSPEC で示されるプログラムまたは $SYSROOT/bin/command に渡して
実行しようとします。command.x が a:/bin 以外にある人は COMSPEC を設定
するようにしてください。
例:
COMSPEC='a:/human/command.x'
o ksh から起動されるプロセスに渡す環境変数領域に余地を残すことができま
す。これにより COMSPEC='a:/human/command.x' のように /e: オプションを
指定しなくても、バッチファイル中で環境変数の操作ができるようになります
(`環境のためのメモリが足りません' と言われなくなります)。
環境変数領域の余地は変数 ENVMARGIN で指定します。ENVMARGIN には 10 進
整数でバイト数を指定します。
例:
ENVMARGIN=512 # 512 バイト余地を確保する
o fish と同じ malloc ルーチン(Extmalloc)を組み込んでいます。シェルの上
で常駐プログラムを実行してもメモリが足りないといって死ぬことがなくなり
ました。
o ksh は起動時に環境変数 ENV で示されるファイルを実行します。ENV の値
として ~/.kshrc などを指定して、~/.kshrc に初期設定を書いておくと良い
でしょう。おまけの項に私が使っている .kshrc を付けておきますので参考に
どうぞ。なお、ログインシェルの場合 $ENV で示されるファイルの実行は
/etc/profile や ~/.profile の後になります。すなわち、~/.profile で
export ENV=~/.kshrc
のようにしておくことで、.profile 実行後および、以降に ksh が起動
されるたびに ~/.kshrc が実行されるようにできます。
● マニュアル、参考書について
o 添付してある ksh.man はすでに groff によりフォーマット済みです。バック
スペースはボールド文字や、アンダーラインを表現しています。
a^Ha が `a' のボールド文字を
_^Ha が `a' にアンダーラインをつけたものを
それぞれ表現しています。
このようなテキストは less を使うと普通に読むことができます。less 上で
これらの修飾つき文字検索する場合は less -i や less を起動後に -i を入
力してから行ないます。
less 以外でも読めるようにするには、
sed 's/.^H//g' ksh.man > output
(^H の部分は本当のバックスペースを入れます)
とか、GNU Emacs 上なら replace-regexp や nuke-nroff-bs (man.el) で、
MicroEMACS なら MAGIC モードで同様に置換します。
o ksh.man は完全なマニュアルではなく、主に Bourne Shell からの違いにつ
いてのみ解説してあります。KornShell の完全な仕様は
『The KornShell -- Command and Programming Language』
AT&T Bell Laboratories
邦訳
『Kornシェル コマンド言語とプログラミング言語』 啓学出版
に書いてあります。ただし PD KornShell は KornShell のすべての機能を網
羅しているわけではありません。
Bourne Shell に関しては
『UNIX step by step』 たぶん啓学出版
に書いてあるそうです。残念ながら私は読んだことがありません。
『UNIX シェルプログラミング』 CQ 出版
という本には、Bourne Shell と C Shell の両方が解説されています。
また、フリーなチュートリアルドキュメントとして 『Bourne Shell 自
習テキスト』というものがあります。日経 MIX が元で、NIFTY Serve
の FSHARP3 にも転載されています。LaTeX で記述されています。
● 配布など
元は Public Domain ですが、Human68k 版への改変部分は私の著作物です。
Human68k 版 ksh は Public Domain ではありません。配布は GNU GENERAL
PUBLIC LICENSE の Version 2 に従ってください。詳しくはアーカイブ中の
COPYING をご覧ください。
● 連絡先
質問、ご意見、ご要望などは以下まで。
homy: PEKIN-NET
pcs30830: ASCII NET
yhori@trl.mei.co.jp: Internet
● おまけ
以下は私が以前使っていた ~/.profile と ~/.kshrc です。当時はログインシェ
ルとしては fish を使っていたので環境変数の設定は手抜きです。alias や
bind で = を使うことに注意しましょう。
~/.profile
---------------------------------------------------------------------------
PATH="a:/users/homy/bin;a:/tmp/bin;a:/usr/local/bin;a:/usr/local/bin/sh;\
a:/usr/gnu/bin;a:/usr/bin;a:/usr/local/gr;a:/usr/local/jokes;\
a:/usr/local/sound;a:/usr/local/lib/perl;a:/usr1/sys/free;a:/human;\
a:/usr1/sys;a:/usr/local/bat;a:/usr1/games;a:/etc"
ENV=~/.kshrc
export PATH ENV
# 本来ならその他諸々の環境変数の設定が続く
if [ x"$KSH_VERSION" != x ]; then
set -o ignoreeof
fi
---------------------------------------------------------------------------
~/.kshrc
---------------------------------------------------------------------------
set -h -o refersysroot
HUGEARG=indirect
case "$-" in
*i*) # インタラクティブシェルなら以下を実行
set -o emacs -o nodups -o expandbrace
CDPATH=";$HOME;$HOME/lib;$HOME/src;a:/usr/local;\
a:/usr/local/src;a:/usr/local/lib;a:/usr1;a:/usr1/data;a:/usr1/com;a:/usr1/doc"
COMSPEC='a:/human/command.x /e:50'
bind ^D=delete-char-forward-or-list-file-or-eot
bind ^C=abort
bind ^I=complete
bind ^P=previous-match
bind ^N=next-match
bind ^[^Y=prev-hist-word
bind ^Q=quote
alias more=less
alias vi=stevie
alias which=whence
alias cp='cp -i'
alias mv='mv -i'
alias man=sman
alias bye=exit
alias ne=nemacs
cd() {
builtin cd $*
pwd
}
see() {
ss -p0
a:/usr/local/bin/see $*
ss -p1
}
cram() {
umount /tmp
a:/usr/local/bin/cram $*
mount /tmp
}
;;
esac
---------------------------------------------------------------------------